#ifndef TERMIOS_H
#define TERMIOS_H

//This file will also be included by C library.

typedef unsigned char       cc_t;
typedef unsigned int        speed_t;
typedef unsigned int        tcflag_t;

#define NCCS 32

struct termios
  {
    tcflag_t c_iflag;        // input mode flags
    tcflag_t c_oflag;        // output mode flags
    tcflag_t c_cflag;        // control mode flags
    tcflag_t c_lflag;        // local mode flags
    cc_t c_line;             // line discipline
    cc_t c_cc[NCCS];         // control characters
    speed_t c_ispeed;        // input speed
    speed_t c_ospeed;        // output speed

  };

// c_cc characters
#define VINTR 0
#define VQUIT 1
#define VERASE 2
#define VKILL 3
#define VEOF 4
#define VTIME 5
#define VMIN 6
#define VSWTC 7
#define VSTART 8
#define VSTOP 9
#define VSUSP 10
#define VEOL 11
#define VREPRINT 12
#define VDISCARD 13
#define VWERASE 14
#define VLNEXT 15
#define VEOL2 16

// c_iflag bits
#define IGNBRK        0000001
#define BRKINT        0000002
#define IGNPAR        0000004
#define PARMRK        0000010
#define INPCK        0000020
#define ISTRIP        0000040
#define INLCR        0000100
#define IGNCR        0000200
#define ICRNL        0000400
#define IUCLC        0001000
#define IXON        0002000
#define IXANY        0004000
#define IXOFF        0010000
#define IMAXBEL        0020000
#define IUTF8        0040000

// c_oflag bits
#define OPOST        0000001
#define OLCUC        0000002
#define ONLCR        0000004
#define OCRNL        0000010
#define ONOCR        0000020
#define ONLRET        0000040
#define OFILL        0000100
#define OFDEL        0000200
#define NLDLY        0000400
#define   NL0        0000000
#define   NL1        0000400
#define CRDLY        0003000
#define   CR0        0000000
#define   CR1        0001000
#define   CR2        0002000
#define   CR3        0003000
#define TABDLY        0014000
#define   TAB0        0000000
#define   TAB1        0004000
#define   TAB2        0010000
#define   TAB3        0014000
#define BSDLY        0020000
#define   BS0        0000000
#define   BS1        0020000
#define FFDLY        0100000
#define   FF0        0000000
#define   FF1        0100000

#define VTDLY        0040000
#define   VT0        0000000
#define   VT1        0040000
#define XTABS        0014000

// c_cflag bit meaning
# define CBAUD        0010017

#define  B0        0000000                // hang up
#define  B50        0000001
#define  B75        0000002
#define  B110        0000003
#define  B134        0000004
#define  B150        0000005
#define  B200        0000006
#define  B300        0000007
#define  B600        0000010
#define  B1200        0000011
#define  B1800        0000012
#define  B2400        0000013
#define  B4800        0000014
#define  B9600        0000015
#define  B19200        0000016
#define  B38400        0000017
#define EXTA B19200
#define EXTB B38400
#define CSIZE        0000060
#define   CS5        0000000
#define   CS6        0000020
#define   CS7        0000040
#define   CS8        0000060
#define CSTOPB        0000100
#define CREAD        0000200
#define PARENB        0000400
#define PARODD        0001000
#define HUPCL        0002000
#define CLOCAL        0004000

#define CBAUDEX 0010000

#define  B57600   0010001
#define  B115200  0010002
#define  B230400  0010003
#define  B460800  0010004
#define  B500000  0010005
#define  B576000  0010006
#define  B921600  0010007
#define  B1000000 0010010
#define  B1152000 0010011
#define  B1500000 0010012
#define  B2000000 0010013
#define  B2500000 0010014
#define  B3000000 0010015
#define  B3500000 0010016
#define  B4000000 0010017
#define __MAX_BAUD B4000000

#define CIBAUD   002003600000                // input baud rate (not used)
#define CMSPAR   010000000000                // mark or space (stick) parity
#define CRTSCTS  020000000000                // flow control

// c_lflag bits
#define ISIG        0000001
#define ICANON        0000002
#define XCASE        0000004
#define ECHO        0000010
#define ECHOE        0000020
#define ECHOK        0000040
#define ECHONL        0000100
#define NOFLSH        0000200
#define TOSTOP        0000400
#define ECHOCTL 0001000
#define ECHOPRT 0002000
#define ECHOKE         0004000
#define FLUSHO         0010000
#define PENDIN         0040000

#define IEXTEN        0100000
#define EXTPROC 0200000

// tcflow() and TCXONC use these
#define        TCOOFF               0
#define        TCOON                1
#define        TCIOFF               2
#define        TCION                3

// tcflush() and TCFLSH use these
#define        TCIFLUSH        0
#define        TCOFLUSH        1
#define        TCIOFLUSH       2

// tcsetattr uses these
#define        TCSANOW          0
#define        TCSADRAIN        1
#define        TCSAFLUSH        2

//ioctl interface
#define TCGETS		0x5001
#define TCSETS		0x5002
#define TCSETSW		0x5003
#define TCSETSF		0x5004

#endif // TERMIOS_H
